#include<pthread.h>
#include<iostream>
#include<string>
#include<unistd.h>

// int count = 1;   //这个是全局变量（是多个线程共享的，地址都一样，不会写实拷贝）


//注意：如果变量被 __thread 进行修饰，那么该count叫做线程的局部存储！
__thread int count = 1;      
//加上 __thread 就不会在已初始化数据段进行定义了，会在两个线程的局部存储里各开辟一份!两个变量，只不过两个变量都叫 count，底层的虚拟地址不一样！
//在写时拷贝时   同一个变量名能指向不同的虚拟地址；          
//编译器编译好之后，二进制符号表中只有一个count，但是线程1会拿着tid 1访问他的存储，线程2会拿着tid 2访问2的存储，各拷一份，各自用各自的！


//线程局部存储作用：在创建线程的时候希望有全局变量，但是又不想让这个全局变量被其他的线程使用！
//但是！！！ 线程局部存储，只能存储内置类型和部分指针！！！（譬如：int  double  float等）


std::string Addr(int &c)
{
    char addr[64];
    snprintf(addr,sizeof(addr),"%p",&c);      
    return addr;
}

void *routine1(void *args)
{
    (void)args;
    while(true)
    {
        std::cout<<"thread - 1,count = "<< count << "[修改一下count]" 
            << "&count: " << Addr(count) << std::endl;
        count++;
        sleep(1);
    }
}

void *routine2(void *args)
{
    (void)args;
    while(true)
    {
        std::cout<<"thread - 2,count = "<< count <<  
            ", &count: "<< Addr(count) << std::endl;
        sleep(1);
    }
}

int main()
{   
    pthread_t tid1,tid2;
    pthread_create(&tid1,nullptr,routine1,nullptr);
    pthread_create(&tid2,nullptr,routine2,nullptr);

    pthread_join(tid1,nullptr);
    pthread_join(tid2,nullptr);

    return 0;
}